---
title: 基础概念
---


## 信息系统生命周期
* **软件系统基本原理**：用分阶段的生命周期计划严格管理、坚持进行阶段评审、实现严格的产品控制、采用现代化程序设计技术、结果应能清楚的审查、开发小组的人员应该少而精、承认不断改进软件工程实践的必要性。

* **软件工程的基本要素**：<font color='RedOrange'>方法、工具、过程</font>

* **软件生命周期周期**: 可行性分析和项目开发计划、需求分析、概要设计（选择系统解决方案、规划子系统）、详细设计（设计子系统内部具体实现）、编码、测试、维护

* **信息系统的生命周期**： 系统规划（可行性分析和项目开发计划）、系统分析（需求分析）、系统设计（概要设计、详细设计）、系统实施（编码、测试）、系统运行与维护（维护）；可以借用软件生命周期表示信息系统的生命周期。
* 为了便于项目管理，信息系统的生命周期还可以划分为立项、开发、维护、消亡四个阶段。
```mermaid
graph LR;
    A[信息系统生命周期]-->B1[立项]-->C1[系统规划]-->D1[可行性分析和项目开发计划];
    A-->B2[开发];
    B2-->C2[系统分析]-->D2[需求分析];
    B2-->C3[系统设计]-->D3[概要设计]-->E1[详细设计];
    B2-->C4[系统实施]-->D4[编码]-->E2[测试];
    B2-->C5[系统验收];
    A-->B3[运维]-->C6[系统运行与维护]-->D5[维护];
    A-->B4[消亡];

```
### <font color='RedOrange'>系统规划阶段</font>
任务是对组织的环境、目标及现行系统的状况进行<font color='RedOrange'>初步调查</font>，根据组织目标和发展战略确定信息系统的发展战略，对<font color='RedOrange'>建设新系统的需求做出分析和预测</font>,同时考虑建设新系统所受的各种约束，研究建设新系统的必要性和可行性。根据需要和可能，给出制建系统的备选方案

输出：<font color='RedOrange'>可行性分析报告、系统设计任务书</font>
### <font color='RedOrange'>系统分析阶段</font>
任务是根据系统设计任务书所确定的范围，对现行系统进行<font color='RedOrange'>详细调查</font>，描述现行系统的业务流程，指出现行系统的的局限性和不足之处，确定新系统的基本目标和逻辑功能要求，即<font color='RedOrange'>提出新系统的逻辑模型</font>。需求分析阶段又称为逻辑设计阶段。这个阶段是<font color='RedOrange'>整个系统建设的关键阶段，也是信息系统建设与一般工程项目的重要区别之一。</font>

输出：<font color='RedOrange'>系统说明书</font>

### <font color='RedOrange'>系统设计阶段</font>

系统分析阶段的任务是回答系统“做什么”的问题，而<font color='RedOrange'>系统设计阶段要回答的问题是“怎么做”</font>。该阶段的任务是根据系统说明书中规定的功能要求，<font color='RedOrange'>具体设计实现逻辑模型的技术方案</font>，也就是<font color='RedOrange'>设计新系统的物理模型</font>。这个阶段又称为<font color='RedOrange'>物理设计阶段</font>。可分为<font color='RedOrange'>总体设计（概要设计）、详细设计两个子阶段</font>。

输出：<font color='RedOrange'>系统设计说明书（概要设计、详细设计说明书）</font>
### <font color='RedOrange'>系统实施阶段</font>
是<font color='RedOrange'>将设计的系统付诸实施的阶段</font>。这一阶段的任务包括计算机等设备的购置、安装和调试、程序的编写和调试、人员培训、数据文件转换、系统调试与转换等。这个阶段的特点是几个互相联系、互相制约的任务同时展开，必须精心安排、合理组织。系统实施是按实施计划分阶段完成的，每个阶段写出实施进展报告。系统测试之后写出系统测试分析报告。

输出：<font color='RedOrange'>实施进展报告、系统测试分析报告</font>
### <font color='RedOrange'>系统运行和维护阶段</font>
系统投入运行后，需要经常进行维护和评价，记录系统运行的情况，根据一定的规则对系统进行必要的修改，评价系统的工作质量和经济效益。







## 能力成熟度模型

能力成熟度模型用来衡量组织的能力成熟度。一般做软件项目的公司都会去申请这个认证。
### 能力成熟度模型CMM


<table>
    <caption>能力成熟度模型CMM</caption>
    <thead>
    <tr>
        <th>能力等级</th>
        <th>特点</th>
        <th>关键过程区域</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>初始级（Initial）</td>
        <td>软件过程的特点是<font color='RedOrange'>杂乱无章</font>，
            有时甚至很混乱，几乎没有明确定义的步骤，
            项目的成功<font color='RedOrange'>完全依赖个人的努力和英雄式核心人物的作用</font></td>
        <td></td>
    </tr>
    <tr>
        <td>可重复级（Repeatable）</td>
        <td>
            建立了<font color='RedOrange'>基本的项目管理过程和实践</font>来跟踪项目费用、进度和功能特性，
            有<font color='RedOrange'>必要的过程准则来重复</font>以前在同类项目中的成功
        </td>
        <td>
            软件配置管理、软件质量保证、软件子合同管理、软件项目跟踪和监督、软件项目策划、软件需求管理
        </td>
    </tr>
    <tr>
        <td>已定义级（Defined）</td>
        <td>
            管理和工程两方面的<font
            color='RedOrange'>软件过程已经文档化、标准化，并综合成整个软件开发组织的标准软件过程</font>。
            所有项目都采用根据实际情况修改后得到的<font color='RedOrange'>标准软件过程来开发和维护软件</font>

        </td>
        <td>
            同行评审、组间评审、软件产品工程、集成软件管理、培训大纲、组织过程定义、组织过程集点
        </td>
    </tr>
    <tr>
        <td>已管理级（Managed）</td>
        <td>
            制定了软件过程和软件质量的<font color='RedOrange'>详细度量标准</font>。对软件过程和产品质量有定量的理解和控制
        </td>
        <td>软件质量管理和定量过程管理</td>
    </tr>
    <tr>
        <td>优化级（Optimized）</td>
        <td>
            加强了定量分析，通过来自过程质量反馈和来自新观念、新技术的反馈使过程能<font
            color='RedOrange'>不断持续地改进</font>
        </td>
        <td>过程更加管理、技术改革管理和缺陷预防</td>
    </tr>
    </tbody>
</table>
### 能力成熟度模型CMMI
是若干过程模型的综合和改进，不仅仅软件，而是支持多个工程学科和领域的、系统的、一致的过程改进框架，能适应现代工程的特点和需要，能提高过程的质量和工作效率。

CMMI 有两种表示方法

1. <font color='RedOrange'>阶段表示法</font>：类似 CMM ，它<font color='RedOrange'>关注组织的成熟度</font>,五个成熟度模型如下：


<table>
    <caption>阶段式模型</caption>
    <thead>
    <tr>
        <th width={'12%'}>能力等级</th>
        <th width={'32%'}>特点</th>
        <th>关键过程区域</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>初始级</td>
        <td>
            过程不可预测且缺乏控制
        </td>
        <td>

        </td>
    </tr>
    <tr>
        <td>已管理级</td>
        <td>
            过程为项目服务
        </td>
        <td>
            需求管理、项目计划、配置管理、项目监督与控制、供应商合同管理、质量和分析、过程和产品质量保证
        </td>
    </tr>
    <tr>
        <td>已定义级</td>
        <td>
            过程为组织服务
        </td>
        <td>
            需求开发、技术解决方案、产品集成、验证、确认组织过程集点、组织级过程定义、组织级培训、集成项目管理、风险管理、集成化的团队、决策分析和解决方案、组织级集成环境
        </td>
    </tr>
    <tr>
        <td>定量管理</td>
        <td>
            过程已度量和控制
        </td>
        <td>
            组织过程性能、定量项目管理
        </td>
    </tr>
    <tr>
        <td>优化级</td>
        <td>
            集中过程改进和优化
        </td>
        <td>
            组织改革与实施、因果分析和解决方案
        </td>
    </tr>
    </tbody>
</table>

2. 连续式模型：关注每个过程域的能力，一个组织对不同的过程域可以达到不同的过程域能力等级。

## 软件过程模型

### 瀑布模型
<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/img/202409301249583.png"/>

瀑布模型（SDLC）：瀑布模型是一个经典的软件生命周期模型，一般将软件开发分为：可行性分析（计划）、需求分析、设计（概要设计、详细设计）、编码（含单元测试）、测试、运行维护等几个阶段

瀑布模型有下列几个特点
1. 从<font color='RedOrange'>上一项开发活动接受该项活动的工作对象作为输入</font>。
2. 利用这一输入，<font color='RedOrange'>实施该项活动应完成的工作内容</font>。
3. 给出该项活动的<font color='RedOrange'>工作成果</font>，作为输入传给下一项开发活动。
4. <font color='RedOrange'>对该项活动的实施工作成果进行评审</font>, 若其工作成果得到确认，则继续进行下一项开发活动；否则返回前一项，甚至更前项的活动，尽量较少多个阶段间的反复。以相对来说较小的费用来开发软件。


### 螺旋模型

<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/img/202409301302755.png"/>

螺旋模型是一个<font color='RedOrange'>演化软件过程模型</font>，将<font color='RedOrange'>原型实现的迭代特征与线性顺序（瀑布）模型中控制的和系统化的方面结合</font>起来。在螺旋模型中，<font color='RedOrange'>软件开发是一系列的增量发布</font>。


开发过程具有<font color='RedOrange'>周期性重复的螺旋线状</font>。四个象限标志每个周期所划分的四个阶段：<font color='RedOrange'>制定计划、风险分析、实施工程和客户评估</font>。螺旋模型强调了风险分析，特别<font color='RedOrange'>适用于庞大而复杂度的，高风险的系统</font>。

:::tip
瀑布模型不适合于需求不明确的情况，螺旋模型就是专门解决瀑布模型这个缺点的。

兼有原型模型的特征，循环往复。
:::
### V模型
<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/img/202409301436251.png"/>

V 模型从整体上看起来，就是一个 V 字型的结构，由左右两边组成。左边的下划线分别代表了需求分析、概要设计、详细设计、编码。右边的上划线代表了单元测试、集成测试、系统测试与验收测试。

1. <font color='RedOrange'>单元测试</font>的主要目的是针对<font color='RedOrange'>编码过程中</font>可能存在的各种错误。
2. <font color='RedOrange'>集成测试</font>的主要目的是针对<font color='RedOrange'>详细设计</font>过程中可能存在的问题。
3. <font color='RedOrange'> 系统测试</font>主要针对<font color='RedOrange'>概要设计</font>，检查系统作为一个整体是否有效地得到运行
4. <font color='RedOrange'>验收测试</font>通常由业务专家或者用户进行，以确认产品能真正符合用户业务上的需要。
5. V 模型用于<font color='RedOrange'>需求明确和需求变更不频繁</font>的情形。

:::tip 生命周期和测试的对应关系
计划要在实施之前完成，所以编码阶段进行单元测试，依据是详细设计说明书；详细设计阶段进行集成测试，依据是概要设计说明书，依次类推。
:::
### 原型化模型

<font color='RedOrange'>原型化模型的第一步就是创建一个快速原型</font>，能够满足项目干系人与未来的用户可以与原型进行交互，再通过与相关干系人进行充分的讨论和分析，
<font color='RedOrange'>最终弄清楚当前系统的需求</font>，进行充分的了解之后，在原型的基础上开发出用户满意的产品。


原型法认为在很难一下子全面准确地提出用户需求的情况下，原型应当具备的特点如下：
1. <font color='RedOrange'>实际可行</font>
2. 具有<font color='RedOrange'>最终系统的基本特征</font>
3. <font color='RedOrange'>构造方便、快速、造价低</font>。原型法的特点在于原型法<font color='RedOrange'>对用户的需求是动态响应、逐步纳入的</font>。

### 增量模型
* 增量模型：首先<font color='RedOrange'>开发核心模块功能</font>，而后与用户确认，之后再开发次核心模块的功能，即每次开发一部分功能，并与用户需求确认，最终完成项目开发，<font color='RedOrange'>优先级最高的服务最先交付</font>。
* 特点：由于并不是从系统整体角度规划各个模块，因此<font color='RedOrange'>不利于模块划分</font>。难点在于<font color='RedOrange'>如何将客户需求划分为多个增量</font>。与原型不同的是<font color='RedOrange'>增量模型的每一次增量版本都可以作为独立可操作的作品</font>，而原型的构造一般是为了演示。


<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/img/202409302021009.png"/>

### 其它模型
* 喷泉模型：是一种<font color='RedOrange'>以用户需求为动力，以对象作为驱动</font>的模型，适合<font color='RedOrange'>面向对象</font>的开发方法。使开发过程具有迭代性和无间隙性。
* 基于构件的开发模型 CBSD：利用<font color='RedOrange'>预先包装的构件来构造应用系统</font>。构件可以是组织内部开发的构件，也可以是商品化成品软件构件；特点是<font color='RedOrange'>增强了复用性</font>,在系统开发过程中，会构建一个构件库，供其它系统复用，因此可以提高可靠性，节省时间和成本。
* 形式化方法模型：建立在<font color='RedOrange'>严格数学基础上</font>的一种软件开发方法，主要活动是生成计算机软件形式化的数学规格说明。

## 软件产品线
* 软件产品线是一个<RedSpan>产品集合</RedSpan>，这些产品<RedSpan>共享一个公共的、可管理的特征集，这个特征集能满足特定领域的特定需求</RedSpan>。软件产品线是一个十分适合专业的开发组织的软件开发方法，能有效地提高软件生产率和质量，缩短开发时间，降低总开发成本。
* 核心资源：包括所有产品所公用的软件架构，通用的构件、文档等。
* 产品集合：产品线中的各种产品。


<Table
    columns={
        [
            {
                title: '维度',
                dataIndex: 'type',
                width: '20%'
            },
            {
                title: '演化方式',
                dataIndex: 'yanhua',
                width: '30%'
            },
            {
                title: '革命方式',
                dataIndex: 'geming',
                width: '30%'
            },
        ]
    }
    dataSource={[
        {
            type: '基于现有产品',
            yanhua: '基于现有产品架构设计产品线的架构，经演化现有构件，开发产品线构件',
            geming: '核心资源的开发基于现有产品集的需求和可预测的、将来需求的超集'
        },
        {
            type: '全新产品线',
            yanhua: '产品线核心资源随产品新成员的需求而演化',
            geming: '开发满足所有预期产品线成员的需求的核心资源'
        }
    ]}
    bordered
    pagination={false}
    title={() => '软件产品线建立方式基本特征'}
/>


## 逆向工程
软件复用是 <RedSpan>将已有软件的各种有关知识用于建立新的软件，以缩减软件开发和维护的花费。</RedSpan>软件复用是提高软件生产力和质量的一种重要技术。早期的软件复用主要是<RedSpan>代码级复用</RedSpan>，被复用的知识专指程序，后来扩大到包括 <RedSpan>领域知识、开发经验、设计决定、体系结构、需求、设计、代码和文档等一切有关方面。</RedSpan>

逆向工程：软件的逆向工程是 <RedSpan>分析程序，力图在比源代码更高抽象层次上建立程序的表示过程</RedSpan>，逆向工程是<RedSpan>设计的恢复过程</RedSpan>。逆向工程的四个级别：
* <RedSpan>实现级</RedSpan>：包括程序的抽象语法树、符号树、过程的设计表示
* <RedSpan>结构级</RedSpan>：包括反映程序分量之间相互依赖关系的信息，例如调用图、结构图、程序和数据结构。
* <RedSpan>功能级</RedSpan>：包括反映程序段功能及程序段之间关系的信息，例如数据和控制流模型。
* <RedSpan>领域级</RedSpan>：包括反映程序分量或程序诸实体与应用领域概念之间对应关系的信息，例如 E-R 模型。

其中，<RedSpan>领域级抽象级别最高，完备性最低，实现级抽象级别最低，完备性最高。</RedSpan>

与逆向工程相关的概念有 **重构、设计恢复、再工程和正向工程**
* 重构是指在<RedSpan>同一抽象级别上转换系统描述形式</RedSpan>
* 设计恢复是指借助工具<RedSpan>从已有程序中抽象出有关的数据设计</RedSpan>、总体结构设计和过程设计等方面的信息。
* 再工程是指 <RedSpan>在逆向工程所获得信息的基础上，修改或重构已有的系统，产生系统的一个新版本</RedSpan>。再工程是对 <RedSpan>现有系统的重新开发过程</RedSpan>，包括<RedSpan>逆向工程、新需求的考虑过程和正向工程</RedSpan>三个步骤。它不仅能从已存在的程序中重新获得设计信息，而且还能使用这些信息来重构现有系统，以改进它的综合质量。再利用再工程重构现有系统的同时，一般会增加新的需求，包括增加新的功能和改善系统的性能。
* 正向工程是指不仅从现有系统中恢复设计信息，<RedSpan>而且使用该信息去改变或重构现有系统</RedSpan>，以改善其整体质量。

## 软件系统工具
软件系统工具通常可以按软件过程活动将软件工具分为软件开发工具、软件维护工具、软件管理工具和软件支持工具。

软件开发工具：需求分析工具、设计工具、编码和排错工具。

软件维护工具：版本控制工具、文档分析工具、开发信息库工具、逆向工程工具、再工程工具

软件管理和软件支持工具：项目管理工具、配置管理工具、软件评价工具、软件开发工具的评价和选择。



